import requests
import json
import os
import zipfile
import shutil
from typing import Optional
import tempfile


class GetPackageBotApi:
    def __init__(self):
        self.temp_dir = tempfile.gettempdir()
        pass

    def get_package_bot(self, url: str, app_id: str) -> bool:
        """
        下载文件并处理

        Args:
            url: 下载URL
            app_id: 应用ID，也用作文件名

        Returns:
            bool: 操作是否成功
        """
        # 构建完整的文件路径
        zip_filename = f"{app_id}"
        zip_path = os.path.join(self.temp_dir, zip_filename)

        try:
            # 下载文件
            response = self._download_file(url, zip_path)
            if response is None:
                return False

            # 验证并提取ZIP文件
            zip_success = self._extract_zip_file(zip_path)

            # 主要成功标准是下载和ZIP提取都成功
            return zip_success

        except Exception as e:
            print(f"操作过程中发生错误: {e}")
            # 发生异常时也尝试清理文件
            self._cleanup_download_file(app_id)
            return False

    def _download_file(self, url: str, filename: str) -> Optional[requests.Response]:
        """
        下载文件到本地

        Args:
            url: 下载URL
            filename: 保存的文件名

        Returns:
            Optional[requests.Response]: 响应对象或None
        """
        try:
            headers = {"Connection": "Keep-Alive"}
            response = requests.get(url, headers=headers, timeout=30)
            response.raise_for_status()  # 检查HTTP错误

            with open(filename, "wb") as f:
                f.write(response.content)

            print(f"文件下载成功: {filename}")
            return response

        except requests.exceptions.RequestException as e:
            print(f"下载文件失败: {e}")
            return None
        except IOError as e:
            print(f"保存文件失败: {e}")
            return None

    def _extract_zip_file(self, zip_path) -> bool:
        """
        提取ZIP文件

        Args:
            zip_path: ZIP文件路径

        Returns:
            bool: 提取是否成功
        """
        if not os.path.exists(zip_path):
            print(f"文件不存在: {zip_path}")
            return False

        if not zipfile.is_zipfile(zip_path):
            print("下载的文件不是有效的ZIP文件")
            return False

        try:
            # 创建提取目录（带~后缀）
            extract_dir_temp = f'{zip_path}~'
            os.makedirs(extract_dir_temp, exist_ok=True)

            with zipfile.ZipFile(zip_path, 'r') as zip_ref:
                zip_ref.extractall(extract_dir_temp)

            print(f"文件成功提取到临时目录: {extract_dir_temp}")

            # 无论ZIP提取是否成功，都尝试删除下载的文件
            self._cleanup_download_file(zip_path)

            # 重命名目录，去除~后缀
            final_dir = zip_path  # 使用原始文件名作为最终目录名
            self._rename_extracted_directory(extract_dir_temp, final_dir)

            return True

        except zipfile.BadZipFile:
            print("ZIP文件损坏")
            return False
        except PermissionError as e:
            print(f"权限错误，无法创建或删除目录: {e}")
            return False
        except Exception as e:
            print(f"提取ZIP文件失败: {e}")
            return False

    def _rename_extracted_directory(self, temp_dir: str, final_dir: str) -> bool:
        """
        重命名提取的目录，去除~后缀

        Args:
            temp_dir: 临时目录路径（带~）
            final_dir: 最终目录路径

        Returns:
            bool: 重命名是否成功
        """
        try:
            # 如果目标目录已存在，先删除
            if os.path.exists(final_dir):
                shutil.rmtree(final_dir)
                print(f"已删除已存在的目录: {final_dir}")

            # 重命名目录
            os.rename(temp_dir, final_dir)
            print(f"目录重命名成功: {temp_dir} -> {final_dir}")
            return True

        except Exception as e:
            print(f"重命名目录失败: {e}")
            return False

    def _cleanup_download_file(self, filename: str) -> bool:
        """
        清理下载的原始文件

        Args:
            filename: 要删除的文件名

        Returns:
            bool: 删除是否成功
        """
        try:
            if os.path.exists(filename):
                os.remove(filename)
                print(f"已删除下载文件: {filename}")
                return True
            else:
                print(f"下载文件不存在，无需删除: {filename}")
                return True
        except Exception as e:
            print(f"删除下载文件失败: {e}")
            return False


def main():
    """主函数示例"""
    # 示例用法 - 需要实际参数
    url = input("请输入下载URL: ").strip()
    app_id = input("请输入应用ID/文件名: ").strip()

    if not url or not app_id:
        print("URL和应用ID不能为空")
        exit(1)

    bot = GetPackageBotApi()
    success = bot.get_package_bot(url, app_id)

    if success:
        print("操作完成")
    else:
        print("操作失败")
        exit(1)


if __name__ == '__main__':
    main()
